﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using A2DFramework.CacheService.CacheProvider.LocalCache;
using A2DFramework.CacheService.Configuration;
using Memcached.ClientLibrary;

namespace A2DFramework.CacheService.CacheProvider
{
    class MemcachedCacheProvider : ICacheExecutor
    {
        private MemcachedClient mc = new MemcachedClient();
        private CacheServerInfo configInfo;
        public MemcachedCacheProvider(CacheServerInfo configInfo)
        {
            this.configInfo = configInfo;

            //初始化池  
            SockIOPool pool = SockIOPool.GetInstance();
            pool.SetServers(new string[] { string.Format("{0}:{1}", configInfo.ServerAddress, configInfo.ServerPort) });//设置连接池可用的cache服务器列表，server的构成形式是IP:PORT（如：127.0.0.1:11211）  
            pool.InitConnections = 3;//初始连接数  
            pool.MinConnections = 3;//最小连接数  
            pool.MaxConnections = 5;//最大连接数  
            pool.SocketConnectTimeout = 1000;//设置连接的套接字超时  
            pool.SocketTimeout = 3000;//设置套接字超时读取  
            pool.MaintenanceSleep = 30;//设置维护线程运行的睡眠时间。如果设置为0，那么维护线程将不会启动,30就是每隔30秒醒来一次  

            //获取或设置池的故障标志。  
            //如果这个标志被设置为true则socket连接失败，将试图从另一台服务器返回一个套接字如果存在的话。  
            //如果设置为false，则得到一个套接字如果存在的话。否则返回NULL，如果它无法连接到请求的服务器。  
            pool.Failover = true;

            pool.Nagle = false;//如果为false，对所有创建的套接字关闭Nagle的算法  
            pool.Initialize();
        }
        public void Put(string key, object value, CacheExpireType expireType, double increment)
        {
            mc.Set(key, value, TimeHelper.CalculateExpirationDateTime(expireType, increment));
        }

        public object Get(string key)
        {
            return mc.Get(key);
        }

        public void Remove(string key)
        {
            mc.Delete(key);
        }
    }
}
